Векторный DSL
Надо как-то назвать язык. Назову его О. Задачи языка:
— Предоставлять конфигурирование системы: выделение кольцевых буферов, аллокация компилированных файлов в виде зада для планировщика, создание таймеров, посылание сообщений между корами по скоростной шине, конфигурация это шины.
— Выступать в роли векторного DSL для K Cell. Каждая K Cell — это по сути вектор или растовский итератор, поддерживающий все его интерфейсы и поддающийся векторизации. Есть также библиотеки распаралеливания этих итераторов.
Сейчас язык парсает основные диалекты K, Q, oK.js, а также Kona. В К мире не приянято писать декларативные парсеры, так как строятся ручные интерпетаторы с встроеным токенайзером. Но поскольку мы воспринимам К программу как DSL к итераторам, нам нужно все AST сразу для ленивого выполнения, поэтому так или иначе строить его нужно. Ну и еще листы в векторы сворачивать, все это тоже можно эффективно делать на этапе парсинга.
Покажу на примере, например нам нужно вычислить скалярное произведение двух векторов:
+/{x*y}[(1;3;4;5;6);(2;6;2;1;3)]
А теперь представим вместо очередей Ioverb устройства, индексы кольцевых буферов в стиле как мы идектируем потоки ввода выводы (0: и 1:) — "1212:" или "3600:".
+/{x*y}[1212:;3600:]
Это транформируется в растовский:
vec1.iter()
.zip(vec2.iter())
.map(|(i, j)| i * j)
.sum()
И в итоге векторизируется LLVM в:
.LBB0_7:
testq %r8, %r8
je .LBB0_9
movdqu 16(%rdx,%rax,4), %xmm2
movdqu 16(%rdi,%rax,4), %xmm3
pshufd $245, %xmm2, %xmm4
pmuludq %xmm3, %xmm2
pshufd $232, %xmm2, %xmm2
pshufd $245, %xmm3, %xmm3
pmuludq %xmm4, %xmm3
pshufd $232, %xmm3, %xmm3
punpckldq %xmm3, %xmm2
paddd %xmm2, %xmm1
movdqu (%rdx,%rax,4), %xmm2
movdqu (%rdi,%rax,4), %xmm3
pshufd $245, %xmm2, %xmm4
pmuludq %xmm3, %xmm2
pshufd $232, %xmm2, %xmm2
pshufd $245, %xmm3, %xmm3
pmuludq %xmm4, %xmm3
pshufd $232, %xmm3, %xmm3
punpckldq %xmm3, %xmm2
paddd %xmm2, %xmm0